/**
 * @Project : algorithm-learning
 * @Author : Ruoyu Wang
 * @User : Momenta
 * @DateTime : 2024/3/16 16:51
 */

//小美拿到了一个数组，她每次操作会将除了第x个元素的其余元素翻倍，一共操作了q次。请你帮小美计算操作结束后所有元素之和。
//由于答案过大，请对10^9+7取模。
//
//输入描述
//  第一行输入两个正整数n,q，代表数组的大小和操作次数。
//  第二行输入n个正整数ai，代表数组的元素。
//  第三行输入一个正整数q，代表操作的次数。
//  接下来的q行，每行输入一个正整数xi，代表第i次操作未被翻倍的元素。
//  1<= n,q <=10^5
//  1<= xi <=n
//  1<= ai <=10^9
//输出描述
//  一个整数，代表操作结束后所有元素之和模10^9+7的值。
//
//示例 1
//输入
//4 2
//1 2 3 4
//1
//2
//输出
//34
//说明
//  第一次操作后，数组变成[1,4,6,8]
//  第二次操作后，数组变成[2,4,12,16]
//  所有元素之和为 34。

#include <iostream>

using namespace std;

const int MOD = 1000000007;

int quickPow(int a, int k) {
    int ans = 1;
    while (k) {
        if (k & 1) {
            ans = (long long) ans * a % MOD;
        }
        k >>= 1;
        a = (long long) a * a % MOD;
    }
    return ans;
}

int main() {
    int n, q;
    scanf("%d%d", &n, &q);

    int a[n];
    for (int i = 0; i < n; ++i) {
        scanf("%d", &a[i]);
    }

    int times[n];
    for (int i = 0; i < n; ++i) {
        times[i] = 0;
    }
    for (int i = 0; i < q; ++i) {
        int x;
        scanf("%d", &x);
        times[x - 1]--;
    }

    long long res = 0;
    for (int i = 0; i < n; i++) {
        res = (res + (long long) a[i] * (long long) quickPow(2, q + times[i])) % MOD;
    }

    printf("%lld", res);

    return 0;
}

//int main() {
//    int n, q, idx;
//    scanf("%d%d", &n, &q);
//    long long res = 0;
//    int a[n];
//    for (int i = 0; i < n; ++i) {
//        scanf("%d", &a[i]);
//        res = (res + a[i]) % MOD;
//    }
//
//    int times[n];
//    for (int i = 0; i < n; ++i) {
//        times[i] = 0;
//    }
//
//    for (int i = 1; i <= q; ++i) {
//        scanf("%d", &idx);
//        res = (2 * res - (long long) (i + times[idx - 1]) * (long long) a[idx - 1]) % MOD;
//        if (res < 0) res = (res + MOD) % MOD;
//        times[idx - 1]--;
//    }
//
//    printf("%lld", res);
//}

